#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>


// 打印数组
void PrintArr(const int (*arr)[4])
{
    system("clear");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            std::cout << arr[i][j] << "  ";
        }
        std::cout << std::endl;
    }
    
}

// 检查数组是否已满 
bool judgeArrFull(const int (*arr)[4], int *site_arr)
{
    // true代表满， flase代表没满
    bool flag = true;
    int site = -1;
    int nn = 0;


    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            site++;
            if(arr[i][j] == 0)
            {
                nn++;
                *site_arr = site;
                site_arr++;
            }
        }
    }

    if(nn == 1)
    {
        flag = true;
    }
    else
    {
        flag = false;
    }
    return flag;
}


// 生成一个数字放到随机位置
int generate_number(int (*arr)[4])
{
    int site_arr[16] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
    memset(site_arr, 55, 16);

    // 检查数组是否已满
    bool is_full = judgeArrFull(arr, site_arr);

    if(is_full == true)
    {
        return -1; // -1代表数组已满，游戏结束
    }

    int site_len = 0;
    for (site_len = 0; site_len < 16; site_len++)
    {
        if(site_arr[site_len] == -1)
        {
            break;
        }
    }
    // for (int xx = 0; xx < 16; xx++)
    // {
    //     std::cout << " " << site_arr[xx];
    // }
    // std::cout << std::endl;
    
    // std::cout << site_len << std::endl;
    
    // 生成随机数
    int site_tmp = rand() % (site_len);
    // std::cout << site_tmp << std::endl;

    int site = site_arr[site_tmp];

    // int *tmp = (int *)arr;
    // *(tmp+site) = 2;

    int tmp = -1;

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            tmp++;
            if(tmp == site)
            {
                arr[i][j] = 2;
            }
        }
    }
}


// 移动单一数组
void move_single_arr(int *val1, int *val2, int *val3, int *val4, int turn)
{
    // 向右
    while (true)
    {
        // 不能移动的情况
        if((*val1 == 0 && *val2 == 0 && *val3 == 0) || (*val1 == 2048 && *val2 == 2048 && *val3 == 2048))
        {
            break;
        }

        if(*val1 == 0 && *val2 == 0 && (*val3 != *val4))
        {
            break;
        }

        if((*val1 != *val2) && (*val2 != *val3) && (*val3 != *val4))
        {
            break;
        }

        if(*val1 == *val2)
        {
            *val2 = *val2 + *val1;
            *val1 = 0;
        }

        if(*val2 == *val3)
        {
            *val3 = *val3 + *val2;
            *val2 = 0;
        }

        if(*val3 == *val4)
        {
            *val4 = *val4 + *val3;
            *val3 = 0;
        }
    }
    

}


// 向上移动数组
void move_up(int (*arr)[4])
{
    for (int j = 0; j < 4; j++)
    {
        while (true)
        {
            // 检查是否能进行移动
            bool is_move = false;
            int i = 3;
            for (i = 3; i > 0; i--)
            {
                if((arr[i-1][j] == 0 && arr[i][j] != 0) || ((arr[i][j] == arr[i-1][j]) && (arr[i-1][j] != 0) && (arr[i-1][j] != 2048) ))
                {
                    is_move = true;
                    break;
                }
            }

            if(is_move == false)
            {
                break;
            }

            // std::cout << is_move <<std::endl;

            // 往前移动一位并加
            arr[i-1][j] = arr[i-1][j] + arr[i][j];
            arr[i][j] = 0;
            continue;
        }
        
    }

    // std::cout << "test" <<std::endl;

    // 增加一个2
    // generate_number(arr);
    // PrintArr(arr);

}


// 向下移动数组
void move_below(int (*arr)[4])
{
    for (int j = 0; j < 4; j++)
    {
        while (true)
        {
            // 检查是否能进行移动
            bool is_move = false;
            int i = 0;
            for (i = 0; i < 3; i++)
            {
                if((arr[i+1][j] == 0 && arr[i][j] != 0) || ((arr[i][j] == arr[i+1][j]) && (arr[i+1][j] != 0) && (arr[i+1][j] != 2048) ))
                {
                    is_move = true;
                    break;
                }
            }

            if(is_move == false)
            {
                break;
            }

            // std::cout << is_move <<std::endl;

            // 往前移动一位并加
            arr[i+1][j] = arr[i+1][j] + arr[i][j];
            arr[i][j] = 0;
            continue;
        }
        
    }

    // std::cout << "test" <<std::endl;

    // 增加一个2
    // generate_number(arr);
    // PrintArr(arr);
}


// 向左移动数组
void move_left(int (*arr)[4])
{
    for (int i = 0; i < 4; i++)
    {
        while (true)
        {
            // 检查是否能进行移动
            bool is_move = false;
            int j = 3;
            for (j = 3; j > 0; j--)
            {
                if((arr[i][j-1] == 0 && arr[i][j] != 0) || ((arr[i][j] == arr[i][j-1]) && (arr[i][j-1] != 0) && (arr[i][j-1] != 2048) ))
                {
                    is_move = true;
                    break;
                }
            }

            if(is_move == false)
            {
                break;
            }

            // std::cout << is_move <<std::endl;

            // 往前移动一位并加
            arr[i][j-1] = arr[i][j-1] + arr[i][j];
            arr[i][j] = 0;
            continue;
        }
        
    }

    // std::cout << "test" <<std::endl;

    // 增加一个2
    // generate_number(arr);
    // PrintArr(arr);

}


// 向右移动数组
void move_right(int (*arr)[4])
{
    for (int i = 0; i < 4; i++)
    {
        while (true)
        {
            // 检查是否能进行移动
            bool is_move = false;
            int j = 0;
            for (j = 0; j < 3; j++)
            {
                if((arr[i][j+1] == 0 && arr[i][j] != 0) || ((arr[i][j] == arr[i][j+1]) && (arr[i][j+1] != 0) && (arr[i][j+1] != 2048) ))
                {
                    is_move = true;
                    break;
                }
            }

            if(is_move == false)
            {
                break;
            }

            // std::cout << is_move <<std::endl;

            // 往前移动一位并加
            arr[i][j+1] = arr[i][j+1] + arr[i][j];
            arr[i][j] = 0;
            continue;
        }
    }

    // std::cout << "test" <<std::endl;

    // 增加一个2
    // generate_number(arr);
    // PrintArr(arr);
}

// 数组交互
void operate_arr(int (*arr)[4])
{
    char ch1;
    char ch2;
    char ch3;

    while (true)
    {
        ch1 = getchar();
        if(ch1 != 27)
        {
            continue;
        }

        ch2 = getchar();
        if(ch2 != 91)
        {
            continue;
        }

        ch3 = getchar();
        if(ch3 == 65)
        {
            move_up(arr);
            break;
        }
        else if(ch3 == 66)
        {
            move_below(arr);
            break;
        }
        else if(ch3 == 68)
        {
            move_left(arr);
            break;
        }
        else if(ch3 == 67)
        {
            move_right(arr);
            break;
        }
    }
}



